home *** CD-ROM | disk | FTP | other *** search
/ Photo CD Demo 1 / Demo.bin / hdf / mac / h10srcst.hqx / Source / HyperHell Source / App NCSA TektoPICT / rgmac.c < prev    next >
Encoding:
C/C++ Source or Header  |  1988-12-28  |  7.7 KB  |  506 lines

  1. #ifdef lint
  2. static char *SCCSid = "%W%    (NCSA)    %G%";
  3. #endif
  4.  
  5. /*
  6.  
  7. rgmac.c by Gaige B. Paulsen
  8.   spawned from rgp.c by Aaron Contorer for NCSA
  9. Copyright 1987, board of trustees, University of Illinois
  10.  
  11. Routines for Macintosh Window output.  
  12.  
  13. */
  14.  
  15.  
  16. /* 
  17.  *    Include files 
  18.  */
  19.  
  20. #include <stdio.h>
  21.  
  22. #include <Controls.h>
  23. #include <Events.h>
  24. #include <OSutils.h>
  25. #include <Packages.h>
  26. #include <Quickdraw.h>
  27. #include <Windows.h>
  28.  
  29. #ifdef MPW
  30. #include "mpw.h"
  31. #endif MPW
  32.  
  33. #define TRUE 1
  34. #define FALSE 0
  35. #define MAXWIND 20
  36. #define WINXMAX 4095
  37. #define WINYMAX 3139
  38. #define INXMAX 4096
  39. #define INYMAX 4096
  40.  
  41. #define SPLASH_SQUARED    4
  42.  
  43. char *malloc();
  44.  
  45. /*
  46.  * display structure....
  47.  */
  48.  
  49. struct RGMwindows {
  50. GrafPtr
  51.     wind;
  52. int
  53.     xorigin,
  54.     yorigin,
  55.     xscale,
  56.     yscale,
  57.     vg,
  58.     vs,
  59.     inuse,
  60.     ingin;
  61. unsigned char
  62.     *name;
  63. int
  64.     width,
  65.     height;
  66. ControlHandle
  67.     zoom,
  68.     vert,
  69.     horiz;
  70.     } RGMwind[ MAXWIND ];
  71.  
  72. long RGMlastclick;
  73.  
  74. int RGMcolor[]=
  75.     { 30,            /* black */
  76.       33,            /* white */
  77.       205,            /* red */
  78.       341,            /* green */
  79.       409,            /* blue */
  80.       273,            /* cyan */
  81.       137,            /* magenta */
  82.       69            /* yellow */
  83.       };
  84.  
  85.  
  86. char *macname = "Macintosh Windows";
  87.  
  88.  
  89. RGGIN(w)
  90. {
  91.     if (RGsetwind(w)) return(-1);
  92.  
  93.     setgraphcurs();
  94.     RGMwind[w].ingin=1;
  95. }
  96.  
  97. RGMoutfunc(f)
  98. int (*f)();
  99. {}
  100.  
  101.  
  102. RGMpencolor(w, color)
  103. {
  104.     if (RGsetwind(w) ) return(-1);
  105.  
  106.     ForeColor((long) RGMcolor[color] );
  107. }
  108.  
  109. RGMclrscr(w)
  110. {
  111.     if (RGsetwind(w) ) return(-1);
  112.  
  113.     ForeColor((long) RGMcolor[0] );
  114.     EraseRect( &RGMwind[w].wind->portRect);
  115. }
  116.  
  117. RGMclose(w)
  118. {
  119.     if (RGsetwind(w) ) return(-1);
  120.  
  121.     DisposeWindow(RGMwind[w].wind);
  122.     RGMwind[w].inuse  = FALSE;
  123.  
  124. }
  125.  
  126. RGMpoint(w,x,y)
  127. {
  128.     if (RGsetwind(w) ) return(-1);
  129.  
  130.     MoveTo(x,y);
  131.     LineTo(x,y);
  132.  
  133. RGMdrawline(w,x0,y0,x1,y1)
  134. int w,x0,y0,x1,y1;
  135. {
  136.     if (RGsetwind(w) ) return(-1);
  137.  
  138.     x0 = (int) ((long) x0 * RGMwind[w].width / INXMAX);
  139.     y0 = RGMwind[w].height - (int) ((long) y0 * RGMwind[w].height / INYMAX);
  140.     x1 = (int) ((long) x1 * RGMwind[w].width/INXMAX);
  141.     y1 = RGMwind[w].height - (int) ((long) y1 * RGMwind[w].height / INYMAX);
  142.  
  143.     MoveTo(x0,y0);
  144.     LineTo(x1,y1);
  145. }
  146.  
  147. RGMpagedone(w)
  148. {
  149. }
  150.  
  151. RGMdataline(w,data,count)
  152. {}
  153.  
  154.  
  155. RGMcharmode(w,rotation,size)
  156. {}
  157.  
  158. RGMshowcur()
  159. {}
  160.  
  161. RGMlockcur()
  162. {}
  163.  
  164. RGMhidecur()
  165. {}
  166.  
  167. RGMbell(w)
  168. {}
  169.  
  170. RGMuncover(w)
  171. {}
  172.  
  173. char *RGMdevname() {
  174.     return(macname);
  175. }
  176.  
  177. RGMinit()
  178. {
  179.     int i;
  180.     for(i=0; i<20; i++) RGMwind[i].inuse=0;
  181. }
  182.  
  183. RGMinfo(w,v,a,b,c,d)
  184. int w,a,b,c,d,v;
  185. {
  186.  
  187.     RGMwind[w].vg=v;
  188. }
  189.  
  190. RGMgmode()
  191. {}
  192.  
  193. RGMtmode()
  194. {}
  195.  
  196. RGMnewwin()
  197. {
  198.     int i=0;
  199.  
  200.     while ( (i< MAXWIND) && (RGMwind[i].inuse) ) i++;
  201.  
  202.     if (i>= MAXWIND) return(-1);
  203.  
  204.     RGMwind[i].wind = GetNewWindow(256,(Ptr) 0L,(Ptr) -1L);
  205.  
  206.     if (RGMwind[i].wind==0L) {
  207.         return(-1);
  208.         }
  209.  
  210.     RGMwind[i].xorigin= 0;
  211.     RGMwind[i].yorigin= 0;
  212.     RGMwind[i].xscale = WINXMAX;
  213.     RGMwind[i].yscale = WINYMAX;
  214.     RGMwind[i].width  = 400;
  215.     RGMwind[i].height = 300;
  216.     RGMwind[i].inuse  = TRUE;
  217.     RGMwind[i].ingin  = 0;
  218.  
  219.     ValidRect( &RGMwind[i].wind->portRect);
  220.  
  221.     return(i);
  222. }
  223.  
  224.  
  225. RGattach(vg,virt,name)
  226. int vg,virt;
  227. char *name;
  228. {
  229.     int i,dnum;
  230.     long time;
  231.     char ts[50];
  232.  
  233.     if ( (dnum=RGfindbyVG( vg) ) <0) return(-1);
  234.  
  235.     RGMwind[dnum].vs=virt;
  236.     RGMwind[dnum].name=(char *)malloc(256);
  237.  
  238.     if (RGMwind[dnum].name==0L) return(-2);
  239.  
  240.     RGMwind[dnum].name[0]=165;
  241.     strncpy( &RGMwind[dnum].name[1], name,255);
  242.  
  243.     GetDateTime(&time);
  244.     IUTimeString(time,FALSE, ts);                /* Put time in the temp string */
  245.     
  246.     strncat( RGMwind[dnum].name, "  ",255);            /* Space, please */
  247.     strncat( RGMwind[dnum].name, ts,255);            /* Place the time string at the end */
  248.  
  249.     SetWTitle(RGMwind[dnum].wind,RGMwind[dnum].name);
  250.     return(0);
  251. }
  252.  
  253. RGdetach(dnum)
  254. int dnum;
  255. {
  256.     int i;
  257.     if (dnum<0 || dnum>=MAXWIND) return(-1);
  258.  
  259.     strncpy( RGMwind[dnum].name, &RGMwind[dnum].name[1], 255);
  260.  
  261.     SetWTitle(RGMwind[dnum].wind,RGMwind[dnum].name);
  262.  
  263.     RGMwind[dnum].vs=-1;
  264. }
  265.  
  266. RGsetwind(dnum)
  267. int dnum;
  268. {
  269.  
  270.     if (dnum<0 || dnum>=MAXWIND) return(-1);
  271.  
  272.     if (!RGMwind[dnum].inuse) return(-1);
  273.  
  274.     SetPort( RGMwind[dnum].wind);
  275.     return(0);
  276. }
  277.  
  278. RGupdate(wind)
  279. GrafPtr wind;
  280. {
  281.     int i=0,done;
  282.  
  283.     if ( (i=RGfindbywind(wind)) <0)
  284.         return(-1);
  285.  
  286.     SetPort(wind);
  287.     BeginUpdate(wind);
  288.  
  289.     VGstopred( RGMwind[i].vg);
  290.     VGpage( RGMwind[i].vg);
  291.     done = VGpred(  RGMwind[i].vg,  RGMwind[i].vg);
  292.     EndUpdate(wind);
  293.     if (!done)
  294.         netputevent(1,128,RGMwind[i].vg);
  295.     return(done);
  296. }
  297.  
  298. RGsupdate(i)
  299. {
  300.     int rg;
  301.     rg=RGfindbyVG( i);
  302.  
  303.     if (rg<0) return(0);
  304.     SetPort( RGMwind[rg].wind);
  305.     if (!VGpred(  RGMwind[rg].vg,  RGMwind[rg].vg) ) {
  306.         netputevent( 1, 128, i);
  307.         }
  308.     else return(1);
  309.     return(0);
  310. }
  311.  
  312. RGgetVG(wind)
  313. GrafPtr wind;
  314. {
  315.     int i;
  316.  
  317.     i=RGfindbywind(wind);
  318.  
  319.     return( RGMwind[i].vg);
  320. }
  321.  
  322. RGgetdnum(wind)
  323. GrafPtr wind;
  324. {
  325.     return(RGfindbywind(wind) );
  326. }
  327.  
  328. RGfindbyVG( vg)
  329. int vg;
  330. {
  331.     int i=0;
  332.  
  333.     while ((i<MAXWIND) && ((!RGMwind[i].inuse) || (RGMwind[i].vg!=vg)))
  334.         i++;
  335.     if (i>=MAXWIND) return(-1);
  336.     return(i);
  337. }
  338.  
  339. RGgetVS( dnum)
  340. int dnum;
  341. {
  342.     return( RGMwind[dnum].vs);
  343. }
  344.  
  345.  
  346. RGfindbywind(wind)
  347. GrafPtr wind;
  348. {
  349.     int i=0;
  350.  
  351.     while ((i<MAXWIND) && ((!RGMwind[i].inuse) || (RGMwind[i].wind!=wind)))
  352.         i++;
  353.     if (i>=MAXWIND) return(-1);
  354.     return(i);
  355. }
  356.  
  357. inSplash( p1, p2)
  358. Point *p1,*p2;
  359. {
  360.     if (p1->h-p2->h>3 || p2->h-p1->h >3)
  361.         return(0);
  362.     if (p1->v-p2->v>3 || p2->v-p1->v >3)
  363.         return(0);
  364.  
  365.     return(1);
  366. }
  367.  
  368. RGmousedown( wind, wherein, pnum)
  369. GrafPtr wind;
  370. Point *wherein;
  371. {
  372.     long lx,ly;
  373.     char thispaceforent[6];
  374.     int i;
  375.     Point where;
  376.  
  377.     where = *wherein;
  378.     if ( (i=RGfindbywind(wind)) <0)
  379.         return(-1);
  380.  
  381.     if (!RGMwind[i].ingin) {
  382.         Point anchor, current,last;
  383. #ifndef MPW
  384.         long TickCount();
  385. #endif MPW
  386.         long GetDblTime(),tc;
  387.         int x0,y0,x1,y1;
  388.         Rect rect;
  389.         char dum[50];
  390.     
  391.         SetPort(wind);
  392.     
  393.         last  = where;
  394.         current = where;
  395.         anchor = where;
  396.     
  397.         PenPat(qd.gray);    
  398.         PenMode( patXor);
  399.     
  400.         SetRect( &rect, 0,0,0,0);
  401.     
  402.         while (StillDown()) {
  403.             GetMouse( ¤t);
  404.             if ( inSplash( ¤t, &anchor) ) continue;
  405.             tc=TickCount();
  406.             while(TickCount()==tc);
  407.             VidSync();
  408.             FrameRect(&rect);
  409.     
  410.             if (anchor.v < current.v) {
  411.                 rect.top=anchor.v;
  412.                 rect.bottom=current.v;
  413.                 }
  414.             else {
  415.                 rect.top=current.v;
  416.                 rect.bottom=anchor.v;
  417.                 }
  418.     
  419.             if (anchor.h < current.h) {
  420.                 rect.left=anchor.h;
  421.                 rect.right=current.h;
  422.                 }
  423.             else {
  424.                 rect.right=anchor.h;
  425.                 rect.left =current.h;
  426.                 }
  427.     
  428.             FrameRect(&rect);
  429.             last=current;
  430.             }
  431.     
  432.         FrameRect(&rect);
  433.  
  434.         PenPat(qd.black);    
  435.         PenMode( patCopy);
  436.  
  437.         if ( !inSplash( &anchor, ¤t)) {
  438.             x0 = (int) ((long) rect.left * RGMwind[i].xscale / RGMwind[i].width );
  439.             y0 = (int) RGMwind[i].yscale -
  440.                  ((long) rect.top * RGMwind[i].yscale / RGMwind[i].height);
  441.             x1 = (int) ((long) rect.right * RGMwind[i].xscale / RGMwind[i].width);
  442.             y1 = (int) RGMwind[i].yscale -
  443.                  ((long) rect.bottom * RGMwind[i].yscale / RGMwind[i].height);
  444.  
  445.             VGzoom( i,
  446.                     x0 +RGMwind[i].xorigin,
  447.                     y1 +RGMwind[i].yorigin,
  448.                     x1 +RGMwind[i].xorigin,
  449.                     y0 +RGMwind[i].yorigin);
  450.  
  451.             VGpage( RGMwind[i].vg);
  452.  
  453.             RGMwind[i].xscale= x1-x0;
  454.             RGMwind[i].yscale= y0-y1;
  455.             RGMwind[i].xorigin= x0+ RGMwind[i].xorigin;
  456.             RGMwind[i].yorigin= y1+ RGMwind[i].yorigin;
  457.  
  458.             sprintf(dum,"VGzoom [%d,%d] -[%d,%d]", x0,y1,x1,y0);
  459.             putln(dum);
  460.             while( !VGpred(  RGMwind[i].vg,  RGMwind[i].vg) )
  461.                 Stask();
  462.             RGMlastclick=0L;
  463.             }
  464.         else {
  465.             if (RGMlastclick && ((RGMlastclick +GetDblTime() ) > TickCount()) ) {
  466.                 RGMwind[i].xscale = WINXMAX;
  467.                 RGMwind[i].yscale = WINYMAX;
  468.                 RGMwind[i].xorigin= 0;
  469.                 RGMwind[i].yorigin= 0;
  470.  
  471.                 VGzoom(i,0,0,WINXMAX,WINYMAX);
  472.                 VGpage( RGMwind[i].vg);
  473.                 while( !VGpred(  RGMwind[i].vg,  RGMwind[i].vg) )
  474.                     Stask();
  475.                 RGMlastclick=0L;
  476.                 }
  477.             else RGMlastclick=TickCount();
  478.             }
  479.         return(0);
  480.     
  481.     }
  482.  
  483.  
  484.     lx= (RGMwind[i].xscale * where.h) / ((long)RGMwind[i].width);
  485.     ly= RGMwind[i].yscale - ((RGMwind[i].yscale * where.v) / ((long)RGMwind[i].height));
  486.  
  487.     VGgindata( RGMwind[i].vg, (int) lx, (int) ly, ' ', thispaceforent);
  488.  
  489.     RSsendstring( RGMwind[i].vs, thispaceforent, 5);
  490.  
  491.     RGMwind[i].ingin=0;
  492.     unsetgraphcurs();
  493.     RGMlastclick=TickCount();
  494. }
  495.  
  496. long *Ticks= (long *)0x16a;
  497.  
  498. VidSync()
  499. {
  500.     long a;
  501.  
  502.     a= *Ticks;
  503.     while (a ==*Ticks);
  504. }
  505.